"""
从 Alpha Advantage 获取 NASDAQ 100 股票的每日价格数据
www.alphavantage.co 是一个提供免费金融数据 API 的网站，主要面向开发者、投资者和研究人员。它的主要特点包括：
实时与历史股票数据（美股、全球股市）
外汇、加密货币、期权等资产类别数据
60+ 技术指标（如 RSI、MACD、布林带等）
市场新闻与情绪分析 API
支持 Excel 和 Google Sheets 插件
提供 JSON 格式的 RESTful API
免费 API Key 注册即可使用
Alpha Vantage 被纳斯达克（NASDAQ）官方认证为其授权的美国市场数据提供商，也被多家金融机构和交易所采用。
简单来说，这是一个适合量化交易、金融分析、教学或开发金融应用的开放数据平台。
"""
import sys
import os

# 获取当前文件所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 获取项目根目录（当前目录的父目录）
root_dir = os.path.dirname(current_dir)
# 将根目录添加到 Python 路径
if root_dir not in sys.path:
    sys.path.append(root_dir)

from symbols import all_symbols
from datetime import datetime, timedelta
import requests
from dotenv import load_dotenv
import json
import akshare as ak
from pathlib import Path
from tools import shsz_tools

load_dotenv()

def get_daily_price(SYMBOL: str):
    FUNCTION = "TIME_SERIES_DAILY"
    OUTPUTSIZE = 'compact'
    APIKEY = os.getenv("ALPHAADVANTAGE_API_KEY")
    url = f'https://www.alphavantage.co/query?function={FUNCTION}&symbol={SYMBOL}&outputsize={OUTPUTSIZE}&apikey={APIKEY}'
    r = requests.get(url)
    data = r.json()
    print(data)
    if data.get('Note') is not None or data.get('Information') is not None:
        print(f"Error")
        return
    with open(f'./daily_prices_{SYMBOL}.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)
    if SYMBOL == "QQQ":
        with open(f'./Adaily_prices_{SYMBOL}.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)

def get_daily_price_from_akshare(SYMBOL: str, start_date: str, end_date: str):
    """
    从 AkShare 获取股票的每日价格数据
    :param SYMBOL: 股票符号，例如 "000001" 表示股票代码为 "000001" 的股票
    :param start_date: 开始日期，格式为 "YYYYMMDD"，例如 "20251001" 表示 2025 年 10 月 1 日
    :param end_date: 结束日期，格式为 "YYYYMMDD"，例如 "20251024" 表示 2025 年 10 月 24 日
    :return: 无返回值，将数据保存到 JSON 文件中
    """
    # start_date 为空，默认为90天以前
    if start_date == "":
        start_date = (datetime.now() - timedelta(days=90)).strftime("%Y%m%d")
    # end_date 为空，默认当前日期
    if end_date == "":
        end_date = datetime.now().strftime("%Y%m%d")
    # stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol=SYMBOL, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")
    stock_zh_a_hist_df = ak.stock_zh_a_daily(symbol=shsz_tools.get_shsz(SYMBOL)+SYMBOL, start_date=start_date, end_date=end_date, adjust="qfq")

    """
    {
        "Meta Data": {
            "1. Information": "Daily Prices (open, high, low, close) and Volumes",
            "2. Symbol": "ABNB",
            "3. Last Refreshed": "2025-10-24",
            "4. Output Size": "Compact",
            "5. Time Zone": "US/Eastern"
        },
        "Time Series (Daily)": {
            "2025-10-24": {
                "1. open": "127.6500",
                "2. high": "129.0600",
                "3. low": "127.3500",
                "4. close": "127.9900",
                "5. volume": "3344365"
            },
            "2025-10-23": {
                "1. open": "127.5300",
                "2. high": "128.8000",
                "3. low": "126.7400",
                "4. close": "127.3500",
                "5. volume": "3239443"
            }
        }
    }
    """
    # end_date 日期格式转换为 "YYYY-MM-DD"
    end_date = datetime.strptime(end_date, "%Y%m%d").strftime("%Y-%m-%d")
    meta_data = {
            "1. Information": "Daily Prices (open, high, low, close) and Volumes",
            "2. Symbol": SYMBOL,
            "3. Last Refreshed": end_date,
            "4. Output Size": "Compact",
            "5. Time Zone": "Asia/Shanghai"
        }
    time_series_daily = {}
    for index, row in stock_zh_a_hist_df.iterrows():
        # row["日期"] 格式为 "2025-10-24"，转换成字符串
        date_str = row["date"].strftime("%Y-%m-%d")
        time_series_daily[date_str] = {
            "1. open": row["open"],
            "2. high": row["high"],
            "3. low": row["low"],
            "4. close": row["close"],
            "5. volume": row["volume"]
        }
    # 按照以上格式封装数据
    formatted_data = {
        "Meta Data": meta_data,
        "Time Series (Daily)": time_series_daily
    }
    # 保存到 JSON 文件
    with open(f'./daily_prices_{SYMBOL}.json', 'w', encoding='utf-8') as f:
        json.dump(formatted_data, f, ensure_ascii=False, indent=4)


def load_config(config_path=None):
    """
    从 configs 目录加载配置文件

    参数:
        config_path: 配置文件路径，如果为 None 则使用默认配置

    返回:
        dict: 配置字典
    """
    if config_path is None:
        # 默认配置文件路径
        config_path = Path(__file__).parent.parent / "configs" / "default_config.json"
    else:
        config_path = Path(config_path)

    if not config_path.exists():
        print(f"❌ 配置文件不存在: {config_path}")
        exit(1)

    try:
        with open(config_path, 'r', encoding='utf-8') as f:
            config = json.load(f)
        print(f"✅ 成功加载配置文件: {config_path}")
        return config
    except json.JSONDecodeError as e:
        print(f"❌ 配置文件 JSON 格式错误: {e}")
        exit(1)
    except Exception as e:
        print(f"❌ 加载配置文件时出错: {e}")
        exit(1)


if __name__ == "__main__":
    config = load_config()
    # Get date range from configuration file
    # INIT_DATE 格式为 "YYYY-MM-DD"
    INIT_DATE = config["date_range"]["init_date"]
    END_DATE = config["date_range"]["end_date"]
    for symbol in all_symbols:
        #get_daily_price(symbol)
        # INIT_DATE 格式为 "YYYY-MM-DD" 转换成 "YYYYMMDD"
        INIT_DATE = INIT_DATE.replace("-", "")
        # END_DATE 格式为 "YYYY-MM-DD" 转换成 "YYYYMMDD"
        END_DATE = END_DATE.replace("-", "")
        get_daily_price_from_akshare(symbol, INIT_DATE, END_DATE)

    #get_daily_price("QQQ")